#include<stdio.h>

char filePath[] = "../tmp/fget.txt";//文本内容:abc

int main(){
    FILE *fp = NULL;
    FILE *fp2 = NULL;
    FILE *fp3 = NULL;

    fp = fopen(filePath, "r");
    fp2 = fopen(filePath, "r");
    fp3 = fopen(filePath, "r");
    if (fp == NULL || fp2 == NULL)
    {
        printf("open file error\n");
    }

    //fgetc 详见http://www.cplusplus.com/reference/cstdio/fgetc/
    int a, b, c, d, e;
    a = fgetc(fp);//fgetc读取一个字符后，fp内部指针会向下移动一个
    b = fgetc(fp);
    c = fgetc(fp);
    d = fgetc(fp);
    e = fgetc(fp);
    printf("%c, %c, %c, %c, %c \n", a, b, c, d, e);//输出a, b, c和两个错误字符
    printf("________________\n");


    int aa;
    while (!feof(fp3))//feof()，识别到文件结尾符EOF或者读取错误，返回true
    {
        aa = fgetc(fp3);
        printf("%c, %x\n", aa, aa);//输出a, b, c 和结束符(结束符是fgetc返回的，不是存在于文件内容的。)
    }

    printf("________________\n");

    int a1;
    a1 = fgetc(fp2);
    while (!feof(fp2))
    {
        printf("%c, %x\n", a1, a1);//输出a, b, c(当feof(fp)中的句柄fp内部指针指向文件内容结尾时，必须要执行下读取，feof才会正确识别结尾符)
        a1 = fgetc(fp2);
    }
   

    printf("________________\n");

    //总结，fgetc()函数，读取一个字符后，fp内部指针就会向下移动一位，当读取到文件末尾时(不是\0哦，\0叫 terminating null-character)，fgetc()会返回EOF并设置一个EOFb标识符给feof()函数使用，此时，调用feof()才会返回>0的值
    //比如文件内容abc，调用三次fgetc()，再调用feof()并不会返回>0，要调用四次fgetc()后再调用feof()才会返回>0判断文件读完，
    //比如文件内容空，直接调用feof()不会返回>0，必须要调用一下fgetc()(函数判断已经到达文件末尾了，返回EOF并设置文件标识符)，再调用feof()才会返回>0
    //If the stream is at the end-of-file when called, the function returns EOF and sets the end-of-file indicator for the stream (feof).
    //不止是fgetc()读取到文件末尾会设置文件标识符，只要有i/o的函数都会，类似getc,
    return 0;
}